#ifndef __SUBSYSTEM_GAME_INFO_H__
#define __SUBSYSTEM_GAME_INFO_H__

#include "Subsystem.hpp"
#include "GameEnum.h"
#include "Engine/Vector2.hpp"
#include "Engine/Color3.hpp"
#include <vector>

using namespace PocketSurvival::Engine;

namespace PocketSurvival
{
    class SubsystemGameInfo : public Subsystem
    {
    public:
        SubsystemGameInfo();

        virtual void update(float dt) override;
        virtual void load(const nlohmann::json& json) override;
        virtual void save(nlohmann::json& json) override;
        virtual void saveToMsgJson(nlohmann::json &jsonData) override;

        virtual const std::string& getName() const override;
        virtual SubUpdateType getUpdateType() override;

    public:
        std::string worldName;                                // 世界名称
        std::string originalSerializationVersion;             // 地形对应的游戏版本号
        GameMode gameMode;                                    // 游戏模式
        EnvironmentBehaviorMode environmentBehaviorMode;      // 环境模式
        TimeOfDayMode timeOfDayMode;                          // 天气变化模式
        float recoverFator;                                   // 回复速率
        float daySpeed;                                       // 游戏时间速度
        bool areWeatherEffectsEnabled;                        // 是否启用天气影响
        bool isAdventureRespawnAllowed;                       // 是否允许冒险模式重生
        bool areAdventureSurvivalMechanicsEnabled;            // 是否启用冒险生存机制
        bool areSupernaturalCreaturesEnabled;                 // 是否启用超自然生物
        TerrainGenerationMode terrainGenerationMode;          // 地形生成模式
        Vector2 islandSize;                                   // 岛屿大小
        int32_t terrainLevel;                                 // 地形高度
        float shoreRoughness;                                 // 海岸粗糙程度
        int32_t terrainBlockIndex;                            // 平地时，陆地用那种方块
        int32_t terrainOceanBlockIndex;                       // 平地时，海洋用什么方块
        float temperatureOffset;                              // 温度便宜量
        float humidityOffset;                                 // 湿度偏移量
        int32_t seaLevelOffset;                               // 海平面高度偏移量
        float biomeSize;                                      // 生物群大小
        // StartingPositionMode startingPositionMode;            // 游戏难度
        // std::string blockTextureName;                         // 使用的材质名称
        bool randomSpawnPosition;                             // 随机生成位置
        int32_t worldSeed;                                    // 世界种子
        double totalElapsedGameTime;                          // 整个世界的持续的时间
        std::vector<Color3> colors;                           // 染色
    };
}

#endif